package com.hd123.rumba.gwt.widget2.client.grid;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.google.gwt.user.client.ui.DockPanel;

/**
 * 分页表格
 * 
 * @author LiQi
 * 
 */
public class RPagingGrid extends DockPanel {

  /** 样式 */
  private static final String STYLENAME = "rb-PagingGrid";

  /** 数据表格 */
  private RGrid grid;

  /** 数据提供者 */
  private RGridPageDataProvider provider;

  /** 翻页工具栏 */
  private RPagingBar pagingBar;

  /** RPagingGridListener集合 */
  protected RPagingGridListenerCollection listeners;

  public RPagingGrid(RGrid grid, RGridPageDataProvider provider) {
    super();

    this.grid = grid;
    this.provider = provider;
    grid.setProvider(provider);
    grid.addRGridSortListener(new GridListener());

    setWidth("100%");
    setStyleName(STYLENAME);

    pagingBar = new RPagingBar(this, provider);
    add(pagingBar, DockPanel.SOUTH);
    setCellVerticalAlignment(pagingBar, ALIGN_BOTTOM);

    add(grid, DockPanel.CENTER);
  }

  /**
   * 数据表格
   * 
   * @return
   */
  public RGrid getGrid() {
    return grid;
  }

  /**
   * 数据提供者
   * 
   * @return
   */
  public RGridPageDataProvider getProvider() {
    return provider;
  }

  /**
   * 翻页工具栏
   * 
   * @return
   */
  public RPagingBar getPagingBar() {
    return pagingBar;
  }

  /**
   * 添加RPagingGridListener事件监听器
   * 
   * @param listener
   */
  public void addRPagingGridListener(RPagingGridListener listener) {
    if (listeners == null)
      listeners = new RPagingGridListenerCollection();
    listeners.add(listener);
  }

  /**
   * 删除RPagingGridListener事件监听器
   * 
   * @param listener
   */
  public void removeRPagingGridListener(RPagingGridListener listener) {
    if (listeners != null)
      listeners.remove(listener);
  }

  /**
   * 触发pageLoad事件
   * 
   */
  protected void firePageLoad() {
    if (listeners != null)
      listeners.firePageLoad(this);
  }

  /**
   * 所选择行的对象列表，对象来自provider
   * 
   * @return
   */
  public List getSelections() {
    List list = new ArrayList();
    if (provider.getValues() == null)
      return list;

    for (Iterator i = grid.getSelections().iterator(); i.hasNext();) {
      int row = ((Integer) i.next()).intValue();
      list.add(provider.getValues().get(row - grid.getHeaderRowCount()));
    }
    return list;
  }

  /**
   * 执行翻页动作
   * 
   * @param page
   *          页序号，从0计数
   */
  public void gotoPage(int page) {
    pagingBar.gotoPage(page);
  }

  /**
   * 刷新表格显示并保持当前页不变，若没有设置过
   * <code>getProvider().setNeedFetch(true)</code> 则不会真正刷新。<br>
   * 保持当前页不变，如果刷新前表格数据为空，则显示第0页。
   * 
   */
  public void refresh() {
    if (provider.getTotalCount() == 0)
      pagingBar.gotoPage(0);
    else
      pagingBar.gotoPage(provider.getCurrentPage());
  }

  /**
   * 强制刷新并保持当前页不变，无论是否设置过
   * <code>getProvider().setNeedFetch(true)</code> 都会刷新。<br>
   * ，如果刷新前表格数据为空，则显示第0页。
   * 
   */
  public void forceRefresh() {
    provider.setNeedFetch(true);
    refresh();
  }

  /**
   * 强制刷新并回到首页，无论是否设置过
   * <code>getProvider().setNeedFetch(true)</code> 都会刷新。
   * 
   */
  public void forceRefreshAndGotoFirstPage() {
    provider.setNeedFetch(true);
    gotoPage(0);
  }

  /**
   * 表格事件处理
   * 
   * @author LiQi
   * 
   */
  private class GridListener implements RGridSortListener {

    public void onSort(RGrid sender, RGridColumnDef sortColumn, String sortDir) {
      // 点击表头排序时刷新表格显示
      forceRefreshAndGotoFirstPage();
    }
  }
}
